package com.fullhome8.cn.wanghongweb.controller.aop;

import com.fullhome8.cn.wanghongweb.util.ArrayUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * apo 打印log信息
 */
@Slf4j
@Aspect
@Component
public class RestControllerAop {

    @Around("execution(* com.fullhome8.cn.wanghongweb.controller.restful.*.*(..))")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        Signature signature = pjp.getSignature();
        MethodSignature methodSignature = (MethodSignature)signature;
        Method targetMethod = methodSignature.getMethod();

        Object[] objects=pjp.getArgs();

        Parameter[] parameters= targetMethod.getParameters();

        if(ArrayUtil.isNotEmpty(objects) && ArrayUtil.isNotEmpty(parameters) && parameters.length==objects.length){
            StringBuilder stringBuilder=new StringBuilder();
            for(int i=0; i<parameters.length;i++){
                if(!parameters[i].getType().getSimpleName().equals("HttpServletRequest") && !parameters[i].getType().getSimpleName().equals("HttpServletResponse")){
                    stringBuilder.append(parameters[i].getName()+" : "+ ToStringBuilder.reflectionToString(objects[i]));
                }
            }
            log.info("---------- 请求 RestController： 【"+pjp.getTarget().getClass().getName() + "】  方法:  【"+pjp.getSignature().getName()+"】  参数： 【 "+stringBuilder.toString()+" 】   begin ----------");
        }else{
            log.info("---------- 请求 RestController： 【"+pjp.getTarget().getClass().getName() + "】  方法:  【"+pjp.getSignature().getName()+"】    begin ----------");
        }
        long begin = System.currentTimeMillis();

        //执行目标方法
        Object result = pjp.proceed();

        log.info("---------- 请求 RestController： 【"+pjp.getTarget().getClass().getName() + "】  方法:  【"+pjp.getSignature().getName()+"】   end ---------- time used: 【"+ (System.currentTimeMillis() - begin) + "ms】 返回给前端：【{}】", ToStringBuilder.reflectionToString(result));
        return result;
    }

    public static void main(String[] args) throws Exception {
        Method method = RestControllerAop.class.getMethod( "main", String[].class );
        for( final Parameter parameter: method.getParameters() ) {
            System.out.println( "Parameter: " + parameter.getName() );
        }
    }

}